//fread(*ptr,size,num,File *f)     从文件中读取内容
#include<netinet/in.h>  // sockaddr_in
#include<sys/types.h>   // socket
#include<sys/socket.h>  // socket
#include<stdio.h>       // printf
#include<stdlib.h>      // exit
#include<string.h>      // bzero
#include<unistd.h>
#include<arpa/inet.h>
#define SERVER_PORT 8000
#define LENGTH_OF_LISTEN_QUEUE 10
#define BUFFER_SIZE 128
#define FILE_NAME_MAX_SIZE 512

int main(void)
{
    // 声明并初始化一个服务器端的socket地址结构
    struct sockaddr_in server_addr;
    bzero(&server_addr, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = htons(INADDR_ANY);
    server_addr.sin_port = htons(SERVER_PORT);

    // 创建socket，若成功，返回socket描述符
    int server_socket_fd = socket(PF_INET, SOCK_STREAM, 0);
    if(server_socket_fd < 0)
    {
        perror("Create Socket Failed:");
        exit(1);
    }
    int opt = 1;
    setsockopt(server_socket_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));

    // 绑定socket和socket地址结构
    if(-1 == (bind(server_socket_fd, (struct sockaddr*)&server_addr, sizeof(server_addr))))
    {
        perror("Server Bind Failed:");
        exit(1);
    }

    // socket监听
    if(-1 == (listen(server_socket_fd, LENGTH_OF_LISTEN_QUEUE)))
    {
        perror("Server Listen Failed:");
        exit(1);
    }

	//printf("!11")
    while(1)
    {
        // 定义客户端的socket地址结构
        struct sockaddr_in client_addr;
        socklen_t client_addr_length = sizeof(client_addr);

        // 接受连接请求，返回一个新的socket(描述符)，这个新socket用于同连接的客户端通信
        // accept函数会把连接到的客户端信息写到client_addr中
        int new_server_socket_fd = accept(server_socket_fd, (struct sockaddr*)&client_addr, &client_addr_length);
        if(new_server_socket_fd < 0)
        {
            perror("Server Accept Failed:");
            break;
        }

        // recv函数接收数据到缓冲区buffer中
	char buffer[BUFFER_SIZE];
        char buffer1[BUFFER_SIZE];
        char buffer2[BUFFER_SIZE][BUFFER_SIZE];
        char buffer3[BUFFER_SIZE];
	int i=0;
	
        
        //bzero(buffer, BUFFER_SIZE);
       
        // 然后从buffer(缓冲区)拷贝到file_name中
        /* if(recv(new_server_socket_fd, buffer, BUFFER_SIZE, 0) < 0)    //filename
        {
            perror("Server Recieve Data Failed:");
            break;
        }*/

        /*char file_name[FILE_NAME_MAX_SIZE+1];
	printf("enter");
        scanf("%s",file_name);
        bzero(file_name, FILE_NAME_MAX_SIZE+1);
        strncpy(file_name, buffer, strlen(buffer)>FILE_NAME_MAX_SIZE?FILE_NAME_MAX_SIZE:strlen(buffer));
        //printf("%s\n", file_name);*/

        // 打开文件并写入文件数据
        char file_name[]="ll.txt";
	//printf("!11")
	FILE *fp1= fopen(file_name, "wb");
	//printf("!11");
        //FILE *fp = fopen(file_name, "r");
	char temp[10];
        if(NULL == fp1)
        {
            printf("File:%s Not Found\n", file_name);
        }
        else
        {
            //bzero(buffer, BUFFER_SIZE);
            //bzero(buffer, BUFFER_SIZE);
            int length = 0;
	    
            printf("%d\n",length);
            //循环直至接收完毕
            while(length = recv(new_server_socket_fd, buffer, BUFFER_SIZE, 0)> 0)
            {  
              //printf("%s",buffer);           //这里测试一下，发现输出的都是乱码 buffer
              if(fwrite(buffer, sizeof(char), length, fp1) < length)
              {
                 printf("File:\t%s Write Failed\n", file_name);
                  break;
              }
        	bzero(buffer, BUFFER_SIZE);
	     }
        }

    // 接收成功后，关闭文件，关闭socket
    printf("Receive File:\t%s From Server IP Successful!\n", file_name);
    fclose(fp1);

    close(new_server_socket_fd);
	
            // 每读取一段数据，便将其发送给客户端，循环直到文件读完为止
           /* while((length = fread(buffer1, sizeof(char), 100, fp1)) > 0)
            {
                for(int j=0;j<strlen(buffer1);j++)
                {
		//printf("%c\n",buffer1[j]);
                if(buffer1[j]=='#')
                i++;
                else
                {
                temp[0]=buffer1[j];
                strcat(buffer2[i],temp);
                }
		
                }
            }
            //bzero(buffer2, BUFFER_SIZE);
            //puts(buffer2[i]);
printf("buffer2[0]:%s\n",buffer2[0]);
  printf("buffer2[1]:%s\n",buffer2[1]);
  printf("buffer2[2]:%s\n",buffer2[2]);
            //puts(buffer3);
            // 关闭文件
            
            //printf("File:%s Transfer Successful!\n", buffer);
        }*/
        // 关闭与客户端的连接
        
    // 关闭监听用的socket
    close(server_socket_fd);
}
    return 0;
}
